package com.ce.framework.datamaintain.action;

import java.io.IOException;
import java.io.PrintWriter;
import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
import java.net.URLEncoder;

import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import net.sf.json.JSONObject;

import org.apache.log4j.Logger;
import org.apache.struts2.ServletActionContext;

import com.ce.framework.auth.AuthenticationFilter;
import com.ce.framework.exception.AppException;
import com.ce.framework.util.BeanAccessUtil;
import com.ce.framework.util.StringUtil;
import com.ce.sys.login.model.User;
import com.opensymphony.xwork2.ActionSupport;

/**
* 创建人：andy
* 创建日期：2010-5-20
* 创建时间：上午11:19:01
* 功能描述：系统的Action基类，提供验证权限、直接输出HTML,JavaScript等元素的方法
* ==============================================
* 修改历史
* 修改人		修改时间		修改原因
*
* ==============================================
*/
public class BaseAction extends ActionSupport {
	private static final long serialVersionUID = 1L;
	
	protected Logger log = Logger.getLogger(this.getClass());
	
	@Deprecated
	protected HttpServletRequest getRequest(){
		return ServletActionContext.getRequest();
	}

	@Deprecated
	protected HttpServletResponse getResponse(){
		return ServletActionContext.getResponse();
	}
	
	/**
	 * 写COOKIE值
	 * @param name		名称
	 * @param value		COOKIE值
	 * @param expire	有效期，单位为天
	 * @param path		绑定路径
	 */
	protected void setCookie(String name,String value,int expire,String path){
		try {
			value = URLEncoder.encode(value,"UTF-8");
		} catch (UnsupportedEncodingException e) {
		}
		Cookie c = new Cookie(name,value);
		c.setPath(path);
		c.setMaxAge(expire*24*60*60);
		getResponse().addCookie(c);
	}

	/**
	 * 读取COOKIE的值
	 * @param name
	 * @return
	 */
	protected String getCookie(String name){
		if(name==null){
			return null;
		}
		for(Cookie c:getRequest().getCookies()){
			if(name.equals(c.getName())){
				try {
					return URLDecoder.decode(c.getValue(),"UTF-8");
				} catch (UnsupportedEncodingException e) {
					return c.getValue();
				}
			}
		}
		return null;
	}
	
	/**
	* 开发人：andy
	* 开发日期: 2013-5-20  下午02:11:33
	* 功能描述: 得到Session中的User对象
	* 方法的参数和返回值: 
	* @return
	*/
	protected User getUser(){
		return User.getUser();
	}
	

	/**
	* 开发人：andy
	* 开发日期: 2013-5-20  上午11:24:08
	* 功能描述: 获得URL请求中附带的参数值
	* 方法的参数和返回值: 
	* @param name
	* @return
	*/
	public String getParameter(String name){
		String s=this.getRequest().getParameter(name);
		if(this.getRequest().getParameter(name)!=null)
		    return this.getRequest().getParameter(name).trim();
		else
			return null;
	}
	public String getParameter(String name,String defaul){
		if(this.getRequest().getParameter(name)!=null)
		    return this.getRequest().getParameter(name).trim();
		else
			return defaul;
	}

	/**
	* 开发人：andy
	* 开发日期: 2013-5-20  下午02:11:47
	* 功能描述: 获得URL请求中附带的参数值(数组)
	* 方法的参数和返回值: 
	* @param name
	* @return
	*/
	public String[] getParameterValues(String name){
		return this.getRequest().getParameterValues(name);
	}
	
	/**
	* 开发人：andy
	* 开发日期: 2013-11-6  下午12:58:47
	* 功能描述: 获取request的attribute的字符串值
	* 方法的参数和返回值: 
	* @param name
	* @return
	*/
	public String getAttr(String name){
		Object obj = this.getRequest().getAttribute(name);
		if(obj==null){
			return null;
		}
		return obj.toString();
	}
	public String getAttr(String name,String defaul){
		Object obj = this.getRequest().getAttribute(name);
		if(obj==null){
			return defaul;
		}
		return obj.toString();
	}
	
	/**
	* 开发人：andy
	* 开发日期: 2013-11-6  下午12:59:03
	* 功能描述: 获取request的attribute的对象值
	* 方法的参数和返回值: 
	* @param name
	* @return
	*/
	public Object getAttribute(String name){
		return this.getRequest().getAttribute(name);
	}

	/**
	* 开发人：andy
	* 开发日期: 2013-11-6  下午12:59:14
	* 功能描述: 设置request的attribute的对象值
	* 方法的参数和返回值: 
	* @param name
	* @param value
	*/
	public void setAttribute(String name,Object value){
		this.getRequest().setAttribute(name,value);
	}

	/**
	* 开发人：andy
	* 开发日期: 2013-11-4  下午02:40:15
	* 功能描述: 对某个对象的属性进行赋值的操作
	* 方法的参数和返回值: 
	* @param bean
	* @param proptName
	* @param value
	* @return
	*/
	protected boolean setBeanPropt(Object bean,String proptName,Object value){
		try {
			BeanAccessUtil.copyProperty(bean, proptName, value);
		} catch (Exception e) {
			return false;
		}
		return true;
	}
	/**
	* 开发人：andy
	* 开发日期: 2013-5-20  上午11:17:36
	* 功能描述: 验证本次操作是否允许，允许返回true,否则返回false
	* 方法的参数和返回值: 
	* @return
	*/
	protected boolean isPermis(){
		HttpServletRequest request = this.getRequest();
		return !AuthenticationFilter.auth.checkAuth(request);
	}

	/**
	* 开发人：andy
	* 开发日期: 2013-5-20  上午10:59:57
	* 功能描述: 返回的页面上弹出消息框，点击消息框的确定后打开指定的URL
	* 方法的参数和返回值: 
	* @param msg
	* @param js
	* @return
	*/
	protected String alertMsgAndOpenUrl(String msg,String url){
		if(msg==null)
			msg = "";
		if(url==null||url.trim().length()==0){
			return this.alertMsgAndReturn(msg);
		}
		return this.alertMsgAndExecJs(msg, "location.href='"+url.replace("'", "\\'")+"'");
	}

	/**
	* 开发人：andy
	* 开发日期: 2013-5-20  上午10:59:17
	* 功能描述: 返回的页面上弹出消息框，点击消息框的确定后执行指定的JavaScript脚本
	* 方法的参数和返回值: 
	* @param msg
	* @param js
	* @return
	*/
	protected String alertMsgAndExecJs(String msg,String js){
		if(msg==null)
			msg = "";
		if(js==null)
			js = "";
		return this.writeJavaScript("$.messager.alert('消息提示','"+msg.replace("'", "\\'").replaceAll("(\r\n)|\r|\n", "\\n")+"','info');\n"+js);
	}

	/**
	* 开发人：andy
	* 开发日期: 2013-5-20  上午10:57:39
	* 功能描述: 返回的页面上弹出消息框，点击消息框的确定后返回上一个页面
	* 方法的参数和返回值: 
	* @param msg
	* @return
	*/
	protected String alertMsgAndReturn(String msg){
		if(msg==null)
			msg = "";
		return this.writeJavaScript("alert('"+msg.replace("'", "\\'").replaceAll("(\r\n)|\r|\n", "\\n")+"');\nhistory.back();");
	}

	/**
	* 开发人：andy
	* 开发日期: 2013-5-20  上午10:55:51
	* 功能描述: 在返回的页面上弹出消息框
	* 方法的参数和返回值: 
	* @param msg
	* @return
	*/
	protected String alertMsg(String msg){
		if(msg==null)
			msg = "";
		return this.writeJavaScript("$.messager.alert('消息提示','"+msg.replace("'", "\\'").replaceAll("(\r\n)|\r|\n", "\\n")+"','info');");
	}
	
	/**
	* 开发人：andy
	* 开发日期: 2013-5-20  上午10:44:05
	* 功能描述: 直接输出JavaScript脚本
	* 方法的参数和返回值: 
	* @param html
	* @return
	*/
	protected String writeJavaScript(String js){
		return this.writeHTML("<script type='text/javascript'>\n"+js+"\n</script>");
	}

	/**
	* 开发人：andy
	* 开发日期: 2013-5-20  上午10:43:40
	* 功能描述: 直接输出HTML文本
	* 方法的参数和返回值: 
	* @param html
	* @return
	*/
	protected String writeHTML(String html){
		HttpServletResponse response = this.getResponse();
		try {
			response.setContentType("text/html; charset=UTF-8"); // 设置 content-type
			response.setCharacterEncoding("UTF-8");  // 设置响应数据编码格式 (输出)
			PrintWriter out = response.getWriter();
			out.println(html);
			out.flush();
			out.close();
		} catch (IOException e) {
			log.error(e.getMessage(),e);
		}
		return "none";
	}

    /**
     * 开发人： andy
     * 开发时间： 2013-10-2 下午02:19:30
     * 功能描述：返回json格式的操作信息，用于前台对数据操作请求之后的判断
     * 方法的参数和返回值
     * @param opFlag  布尔值，true：opState返回success，否则返回failure
     * @param opInfo  操作的返回信息，用于前台页面的信息展示和判断等操作
     * @throws AppException
     * void 
     * ==================================
     * 修改历史
     * 修改人        修改时间      修改原因及内容
     *
     * ==================================
     */
    public String returnInfoForJS(boolean opFlag,String opInfo){
    	if(StringUtil.isBlank(opInfo))
    		opInfo = "";
		JSONObject obj = new JSONObject();
		obj.put("opState", opFlag?"success":"failure");
		obj.put("opInfo", opInfo);
		return this.writeHTML(obj.toString());
    }
    
    /**
     * 开发人： andy
     * 开发时间： 2013-8-25 上午09:54:18
     * 功能描述：返回json格式的操作信息，用于前台对数据操作请求之后的判断
     * 方法的参数和返回值
     * @param opFlag  布尔值，true：opState返回success，否则返回failure
     * @param opInfo  操作的返回信息，用于前台页面的信息展示
     * @param opValue 操作的返回信息，用于前台页面接收的参数
     * @return
     * String 
     * ==================================
     * 修改历史
     * 修改人        修改时间      修改原因及内容
     *
     * ==================================
     */
    public String returnInfoForJS(boolean opFlag,String opInfo,Object opValue){
    	if(StringUtil.isBlank(opInfo))
    		opInfo = "";
		JSONObject obj = new JSONObject();
		obj.put("opState", opFlag?"success":"failure");
		obj.put("opInfo", opInfo);
		obj.put("opValue", opValue);
		return this.writeHTML(obj.toString());
    }

	/**
	 * 开发人： andy
	 * 开发时间： 2013-7-21 下午03:04:47
	 * 功能描述：用于提交数据时的验证函数。添加和编辑操作时对该函数进行了调用，子类中可以重写该方法实现自定义验证
	 * 方法的参数和返回值
	 * @return
	 * @throws AppException
	 * boolean 
	 * ==================================
	 * 修改历史
	 * 修改人        修改时间      修改原因及内容
	 *
	 * ==================================
	 */
	protected boolean validateSubmit() throws AppException{
		// TODO Auto-generated method stub
		return true;
	}
    
}
